package org.smog.core.config.security;

import org.springframework.security.access.prepost.PreAuthorize;

/**
 * Spring Security主要是从两个方面解决安全性问题：
 * <p>
 * 1.web请求级别：使用Servlet规范中的过滤器（Filter）保护Web请求并限制URL级别的访问。
 * 2.方法调用级别：使用Spring AOP保护方法调用，确保具有适当权限的用户才能访问安全保护的方法。
 * <p>
 * access(String)	如果给定的SpEL表达式计算结果为true，就允许访问
 * anonymous()	允许匿名用户访问
 * authenticated()	允许认证过的用户访问
 * denyAll()	无条件拒绝所有访问
 * fullyAuthenticated()	如果用户是完整认证的话（不是通过Remember-me功能认证的），就允许访问
 * hasAnyAuthority(String…)	如果用户具备给定权限中的某一个的话，就允许访问
 * hasAnyRole(String…)	如果用户具备给定角色中的某一个的话，就允许访问
 * hasAuthority(String)	如果用户具备给定权限的话，就允许访问
 * hasIpAddress(String)	如果请求来自给定IP地址的话，就允许访问
 * hasRole(String)	如果用户具备给定角色的话，就允许访问
 * not()	对其他访问方法的结果求反
 * permitAll()	无条件允许访问
 * rememberMe()	如果用户是通过Remember-me功能认证的，就允许访问
 * <p>
 * Spring Security 支持的所有SpEL表达式如下：
 * <p>
 * 安全表达式　	计算结果
 * authentication　　	用户认证对象
 * denyAll　　	结果始终为false
 * hasAnyRole(list of roles)　　	如果用户被授权指定的任意权限，结果为true
 * hasRole(role)	如果用户被授予了指定的权限，结果 为true
 * hasIpAddress(IP Adress)	用户地址
 * isAnonymous()　　	是否为匿名用户
 * isAuthenticated()　　	不是匿名用户
 * isFullyAuthenticated　　	不是匿名也不是remember-me认证
 * isRemberMe()　　	remember-me认证
 * permitAll	始终true
 * principal	用户主要信息对象
 * <p>
 * <p>
 * 表达式驱动的注解，包括@PreAuthorize、@PostAuthorize、@PreFilter和@PostFilter。
 * 注解	描述
 *
 * @PreAuthorize 在方法调用之前，基于表达式的计算结果来限制对方法的访问
 * @PostAuthorize 允许方法调用，但是如果表达式计算结果为false，将抛出一个安全性异常
 * @PostFilter 允许方法调用，但必须按照表达式来过滤方法的结果
 * @PreFilter 允许方法调用，但必须在进入方法之前过滤输入值
 * @Description: Created by IntelliJ IDEA.
 * @project_name: smogTemp
 * @time: 2020-05-14 11:22
 * @email: 17685306043@163.com
 * @author: huangZhongYao
 */
@PreAuthorize("denyAll() or hasRole('" + SecurityConstant.Role.ADMIN + "')")
public class BaseSecurityController {
}
